毫秒精度的定时器。底层基于epoll_wait
和setitimer
实现,数据结构使用最小堆
,可支持添加大量定时器。
- 在同步进程中使用
setitimer
和信号实现,如Manager
和TaskWorker
进程 - 在异步进程中使用
epoll_wait/kevent/poll/select
超时时间实现
底层使用最小堆数据结构实现定时器,定时器的添加和删除,全部为内存操作,因此性能是非常高的。官方的基准测试脚本 https://github.com/swoole/swoole-src/blob/master/benchmark/timer.php 中,添加或删除10万
个随机时间的定时器耗时为0.08s
左右。
~/workspace/swoole/benchmark$ php timer.php
add 100000 timer :0.091133117675781s
del 100000 timer :0.084658145904541s
定时器是内存操作,无
IO
消耗
Timer
与PHP
本身的pcntl_alarm
是不同的。pcntl_alarm
是基于时钟信号 + tick
函数实现存在一些缺陷:
- 最大仅支持到秒,而
Timer
可以到毫秒级别 - 不支持同时设定多个定时器程序
pcntl_alarm
依赖declare(ticks = 1)
,性能很差
底层不支持时间参数为0
的定时器。这与Node.js
等编程语言不同。在Swoole
里可以使用Swoole\Event::defer
实现类似的功能。
Swoole\Event::defer(function () {
echo "hello\n";
});
上述代码与JS
中的setTimeout(0, func)
效果是完全一致的。